package com.itheima.service.impl;


import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckGroupMapper;
import com.itheima.dao.CheckItemMapper;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.PageResult;
import com.itheima.pojo.QueryPageBean;
import com.itheima.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @version V1.0
 * @author: yongjichu
 * @date: 2020/1/11 11:31
 * @description:
 */
@Service(interfaceClass = CheckGroupService.class)
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {
    @Autowired
    private CheckGroupMapper checkGroupMapper;
    @Autowired
    private CheckItemMapper checkItemMapper;

    /**
     * 新增检查组
     * @param checkGroup
     *
     */
    @Override
    public void add(CheckGroup checkGroup) {
        //在这里不仅要在checkgroup里添加数据，而且还要与表checkitem的表进行关联
        checkGroupMapper.add(checkGroup);
        //获取主键回显的主键id，因为在mybatis的映射文件中我们配置了当增加完数据后回显主键
        Integer checkgroupid=checkGroup.getId();
        setCheckGroupAndCheckitem(checkgroupid,checkGroup.getCheckitemIds());

    }

    /**
     * 检查组的分页
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult queryPage(QueryPageBean queryPageBean) {
        //使用分页插件
        Page page=PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        List<CheckGroup> checkGroupList=checkGroupMapper.queryPage(queryPageBean.getQueryString());
        return new PageResult(page.getTotal(),checkGroupList);
    }

    /**
     * 根据id查出检查组的信息，检查项的所有信息和用户选择的检查项的id，用于回显页面
     * @return
     * @param id
     */
    @Override
    public Map findById(Integer id) {
        //根据id查出检查组的信息用于数据的回显
        CheckGroup checkGroup=checkGroupMapper.findAll(id);
        //查询出检查项的所有数据，因为前面已经查过一次，所以直接引入checkItemMapper，调用其中的findAll方法就行
        List<CheckItem> checkItemList=checkItemMapper.findAll();
        //根据检查组id查出对应的所有的检查项的id
        List<Integer> checkItemIds=checkGroupMapper.findCheckItemIdsByCheckGroupId(id);
       Map map=new HashMap();
       map.put("checkGroup",checkGroup);
       map.put("checkItemList",checkItemList);
       map.put("checkItemIds",checkItemIds);
        return map;
    }

    /**
     * 编辑检查组
     * @param checkGroup
     */
    @Override
    public void edit(@RequestBody CheckGroup checkGroup) {
        //1.首先根据检查组id将检查组的基本信息更新
        checkGroupMapper.updataCheckGroup(checkGroup);
        //2.根据检查组的id删除t_checkgroup_checkitem中的老的关系
        checkGroupMapper.deleteCheckGroupAndCheckItemById(checkGroup.getId());
        //3.根据传递进来的用户勾选的新的检查项id数组，重新建立表关系,
          //3.1因为之前在新增检查组的时候已经做过建立两个表之间关联的逻辑直接调用setCheckGroupAndCheckitem方法即可
          //调用setCheckGroupAndCheckitem方法需要两个参数，一个是检查组的id一个是用户勾选的检查项的id数组，这两个参数在checkGroup中已经携带进来啦
        setCheckGroupAndCheckitem(checkGroup.getId(),checkGroup.getCheckitemIds());
    }

    /**
     * 查询所有的检查组信息
     * @return
     */
    @Override
    public List<CheckGroup> findAllTwo() {
        List<CheckGroup> checkGroupList=checkGroupMapper.findAllTwo();
        return checkGroupList;
    }


    /**
     * 在这个方法里把表checkGroup与表checkitem进行关联，通过中间表t_checkgroup_checkitem
     * 我们通过主键回显已经得到了t_checkgroup表中的数据，也已经有了用户勾选的检查项的id数组checkitemIds
     * 我们就要把这两个数据进行关联，比如说检查组（也就是表t_checkgroup）的主键是5，用户勾选的数组为[28,29,30],
     *那么我们就要把数据存放到表t_checkgroup_checkitem中，以这种形式（5，28），（5，29），（5，30）
     * @param checkgroupid
     * @param checkitemIds
     */
    private void setCheckGroupAndCheckitem(Integer checkgroupid, List<Integer> checkitemIds) {
        /**
         * 循环遍历checkitemIds数组，把选中检查项的id与检查组的id进行关联
         * 首先判断checkitemIds这个数组不为null而且不为空
         *
         */
       if(checkitemIds!=null&&checkitemIds.size()>0){
           //在这里循环用户勾选的检查项的id
//           for (Integer checkitemId : checkitemIds) {
//               //在这里进行调用dao层方法将数据插入到表t_checkgroup_checkitem中
//               checkGroupMapper.setCheckGroupAndCheckItem(checkgroupid,checkitemId);
//           }
           /**
            * 以上这种方法写的话太玛法因为每遍历一次checkitemIds就要去数据库添加一条数据，现在我们让他得到所有数据后再以起去数据库中添加数据
            */
           //定义一个list集合里面存放得到的map数据
           ArrayList<Map> batchParams= new ArrayList<>();
           for (Integer checkitemId : checkitemIds) {

               HashMap<String, Integer> map = new HashMap<>();
               map.put("checkgroup_id",checkgroupid);
               map.put("checkitem_id",checkitemId);
               batchParams.add(map);
           }
           //将得到所有数据batchParams作为参数调用方法执行增加语句
           checkGroupMapper.setCheckGroupAndCheckItem(batchParams);
       }
    }
}
